Jestでファイル作成処理をテストする
こんにちは、CX事業本部 IoT事業部の若槻です。
Jestは、JavaScriptのテスティングフレームワークです。
今回は、ファイル作成処理をJsetでテストしてみました。
やってみた
環境
% node --version v12.14.0 $ npx jest --version 26.6.3 $ npx tsc -v Version 3.9.10
テスト対象のコード
Jestのテスト対象とする処理のコードです。引数のBase64の画像データをjpegファイルへ書き込む処理を行います。またこの処理はAWS Lambda上で実行するため、書き込み先パスはtemp
ディレクトリ配下となっています。
import fs from "fs"; import path from "path"; export const writeDataToFile = (imageData: string) => { const data = imageData.replace("data:image/jpeg;base64,", ""); const fileName = new Date().getTime() + ".jpeg"; const filePath = path.join(__dirname, "temp", fileName); fs.writeFileSync(filePath, data, { encoding: "base64" }); };
テストコード
テストコードです。以下の3点のテストを行っています。3については今回は引数の値から作成内容が予測できる処理であるためテストできましたが、処理内容によってはテストできないかも知れません。
- 関数の返り値
- 作成されたファイル数
- 作成されたファイルの内容
import { writeDataToFile } from "../src/writeDataToFile"; import fs from "fs"; import path from "path"; test("画像データをローカルファイルに書き込む", async (): Promise<void> => { //tempディレクトリの作成 const tempPath = path.join(__dirname, "..", "src", "temp"); fs.mkdirSync(tempPath); //ダミーデータを引数にテスト対象のモジュールを実行 const dymmyDataPath = path.join(__dirname, "dummyData"); const imageData = fs.readFileSync(dymmyDataPath).toString(); const response = writeDataToFile(imageData); //作成されたファイルのパスと内容を取得 const writtenFiles = fs.readdirSync(tempPath); const writtenData = fs .readFileSync(path.join(tempPath, writtenFiles[0]), "base64") .toString(); //テスト expect(response).toBeUndefined; //1.関数の返り値 expect(writtenFiles.length).toBe(1); //2.作成されたファイル数 expect("data:image/jpeg;base64," + writtenData).toBe(imageData.trim()); //3.作成されたファイルの内容 //後始末 fs.unlinkSync(path.join(tempPath, "/", writtenFiles[0])); //作成したファイルの削除 fs.rmdirSync(tempPath); //作成したディレクトリの削除 });
ダミーデータです。
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...
テストの実施
実行すると、テストが無事パスしました。
$ npx jest ./test/writeDataToFile.test.ts ts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020. This might lead to some unexpected errors when running tests with `ts-jest`. To fix this, you can check https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping PASS test/writeDataToFile.test.ts ✓ 画像データをローカルファイルに書き込む (4 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 3.753 s Ran all test suites matching /.\/test\/writeDataToFile.test.ts/i.
少しハマった箇所
作成されたファイルの内容のテストで、ダミーデータの内容に対してtrim()
しているのは、私の環境ではデータ内容の末尾にPrettirにより改行が自動で入ってしまい、その削除のためです。少しハマりました。
//テスト expect(response).toBeUndefined; //1.関数の返り値 expect(writtenFiles.length).toBe(1); //2.作成されたファイル数 expect("data:image/jpeg;base64," + writtenData).toBe(imageData.trim()); //3.作成されたファイルの内容
参考
- node.js - NodeJS accessing file with relative path - Stack Overflow
- Nodejsでbase64エンコードされた画像を復元する - Qiita
- AWS Lambdaでファイル入出力をしてみる - Qiita
以上